package com.king.designpatterns.创造型模式.抽象工厂模式;

/**
 * 抽象工厂模式（Abstract Factory Pattern）是一种比较常用的模式。
 *
 * 定义：为创建一组相关或相互依赖的对象提供一个接口，而且无须指定它们的具体类
 *
 * 角色：
 *      ■ 抽象工厂（Abstract Factory）角色：
 *          该角色是抽象工厂模式的核心，与应用系统无关，任何创建对象的工厂类必须实现这个接口。
 *      ■ 具体工厂（Concrete Factory）角色：
 *          该角色实现了抽象工厂接口，含有选择合适的产品对象的逻辑，并且受到应用程序的调用以创建产品对象。
 *      ■ 抽象产品（Abstract Product）角色：
 *          该角色负责定义产品的共性，实现对产品最抽象的定义。
 *      ■ 具体产品（Concrete Product）角色：
 *          该角色实现抽象产品角色所声明的接口，抽象工厂模式所创建的任何产品对象都是某个具体产品角色的实例。
 *
 * 优缺点：
 *      优点：
 *          ■ 产品族内的约束为非公开状态，在不同的工厂中，各种产品可能具有不同的相互依赖关系，这些依赖关系由工厂封装在其内部，对于工厂的使用者是不可见的。
 *          ■ 生产线的扩展非常容易，如果要针对同一产品族建立新的生产线，只需要实现产品族中的所有产品接口并建立新的工厂类即可。
 *      缺点：
 *          抽象工厂模式的最大缺点就是产品族本身的扩展非常困难，如果需要在产品族中增加一个新的产品类型，则需要修改多个接口，并且会影响已有的工厂类。
 *
 * 使用场景：
 *      当一个对象族（或是一组没有任何关系的对象）都有相同的约束，则可以使用抽象工厂模式。
 *
 * @author king
 * @date 2021-06-07 15:46
 */
public class AbstractFactoryPattern {
    public static void main(String[] args) {
        // 定义两个工厂
        AbstractFactory factory1 = new ConcreteFactory1();
        AbstractFactory factory2 = new ConcreteFactory2();
        // 生产等级为1的产品A
        ProductA a1 = new ProductA1();
        // 生产等级为2的产品A
        ProductA a2 = new ProductA2();
        // 生产等级为1的产品B
        ProductB b1 = new ProductB1();
        // 生产等级为2的产品B
        ProductB b2 = new ProductB2();
        // 业务处理
        a1.method1();
        a2.method1();
        b1.method1();
        b2.method1();
    }
}
